Apache Commons Collections লাইব্রেরি Java Collections Framework এর উপর ভিত্তি করে অতিরিক্ত এবং উন্নত ডাটা স্ট্রাকচার সরবরাহ করে, যা প্রোগ্রামিংকে আরও কার্যকরী এবং নমনীয় করে তোলে। এর মধ্যে একটি শক্তিশালী এবং কার্যকরী ডাটা স্ট্রাকচার হলো Bidirectional Maps (BidiMap)। এটি এমন একটি ম্যাপ যেখানে আপনি কেবল কী থেকে মান (key-value) রেজলভ করতে পারেন না, বরং মান থেকে কীও (value-key) রেজলভ করতে পারেন।
এছাড়া, Advanced Map Operations এর মাধ্যমে ম্যাপের উপর আরও উন্নত কার্যক্রম এবং অপারেশনগুলো সহজভাবে সম্পাদন করা যায়, যেমন ফিল্টারিং, ট্রান্সফরমেশন, এবং কাস্টম কীবেজ় অপারেশন।
Bidirectional Maps (BidiMap)
BidiMap এমন একটি ম্যাপ যা আপনাকে দ্বৈত দিক থেকে মান (key-value) এবং কী (value-key) অ্যাক্সেস করার সুবিধা দেয়। এটি একটি দ্বৈত ম্যাপ যেখানে একটি কী থেকে মান এবং একই মান থেকে কী খুঁজে পাওয়া যায়। অর্থাৎ, আপনি যখন একটি BidiMap ব্যবহার করেন, তখন আপনি কেবলমাত্র এক দিক দিয়ে নয়, বরং উল্টো দিক থেকেও মান খুঁজে পাবেন।
BidiMap এর মধ্যে কী এবং মান উভয়ের জন্য আলাদা reverse mapping থাকবে, যা সহজে মানের ভিত্তিতে কী খুঁজে বের করার সুবিধা দেয়।
BidiMap এর সুবিধা:
- দ্বৈত দিকের অ্যাক্সেস: একাধিক দিক থেকে কী এবং মান অ্যাক্সেস করা সম্ভব।
- ডেটার বিপরীত প্রক্রিয়াকরণ: যখন আপনি মানের ভিত্তিতে কী পেতে চান, তখন এটি সহজে পাওয়া যায়।
- বিশেষ ডাটা স্ট্রাকচার: এটি সাধারণ HashMap বা TreeMap এর চেয়ে আরো বেশি কার্যকরী এবং নমনীয়।
BidiMap Example:
import org.apache.commons.collections4.map.DualHashBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
// Creating a BidiMap
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Adding key-value pairs
bidiMap.put("Apple", "Fruit");
bidiMap.put("Carrot", "Vegetable");
// Accessing data by key
System.out.println("Apple is a " + bidiMap.get("Apple")); // Output: Apple is a Fruit
// Accessing data by value (reverse mapping)
System.out.println("Fruit is " + bidiMap.getKey("Fruit")); // Output: Fruit is Apple
}
}
আউটপুট:
Apple is a Fruit
Fruit is Apple
এখানে:
DualHashBidiMapব্যবহার করে আমরা একটি BidiMap তৈরি করেছি।- প্রথমে key থেকে value অ্যাক্সেস করেছি, তারপর value থেকে key অ্যাক্সেস করেছি।
Advanced Map Operations
Apache Commons Collections এর মাধ্যমে আপনি Advanced Map Operations (যেমন filtering, transformation, aggregation) খুব সহজে করতে পারেন। এর মাধ্যমে ম্যাপের মধ্যে উন্নত অপারেশন করতে পারা যায় যা সাধারণ HashMap বা TreeMap এ করা সম্ভব নয়।
Advanced Map Operations উদাহরণ:
- Map Filtering: ম্যাপের উপাদানগুলিকে একটি শর্ত অনুসারে ফিল্টার করা।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Predicate;
import java.util.HashMap;
import java.util.Map;
public class MapFilteringExample {
public static void main(String[] args) {
// Creating a Map
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 2);
map.put("cherry", 7);
// Filtering map by values
Map<String, Integer> filteredMap = MapUtils.predicatedMap(map, new Predicate<String>() {
@Override
public boolean evaluate(String key) {
return map.get(key) > 3; // Filter by value > 3
}
});
System.out.println(filteredMap); // Output: {apple=5, cherry=7}
}
}
আউটপুট:
{apple=5, cherry=7}
এখানে:
- MapUtils.predicatedMap ব্যবহার করে ম্যাপের উপাদানগুলিকে ফিল্টার করা হয়েছে, যেখানে মান ৩ এর বেশি হওয়া প্রয়োজন।
- Map Transformation: ম্যাপের উপাদানগুলিকে ট্রান্সফর্ম করা (যেমন কী বা মান পরিবর্তন করা)।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Transformer;
import java.util.HashMap;
import java.util.Map;
public class MapTransformationExample {
public static void main(String[] args) {
// Creating a Map
Map<String, String> map = new HashMap<>();
map.put("apple", "fruit");
map.put("carrot", "vegetable");
// Transforming the map values to uppercase
Map<String, String> transformedMap = MapUtils.transformedMap(map, new Transformer<String, String>() {
@Override
public String transform(String value) {
return value.toUpperCase(); // Transforming value to uppercase
}
});
System.out.println(transformedMap); // Output: {apple=FRUIT, carrot=VEGETABLE}
}
}
আউটপুট:
{apple=FRUIT, carrot=VEGETABLE}
এখানে:
- MapUtils.transformedMap ব্যবহার করে ম্যাপের মানকে uppercase তে ট্রান্সফর্ম করা হয়েছে।
- Map Aggregation: ম্যাপের উপর বিভিন্ন গণনা বা পরিসংখ্যান করা (যেমন যোগফল, গড় মান বের করা)।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapAggregationExample {
public static void main(String[] args) {
// Creating a Map
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 2);
map.put("cherry", 7);
// Summing the values of the map
int sum = MapUtils.sum(map);
System.out.println("Sum of all values: " + sum); // Output: Sum of all values: 14
}
}
আউটপুট:
Sum of all values: 14
এখানে:
- MapUtils.sum() ব্যবহার করে ম্যাপের সব মানের যোগফল বের করা হয়েছে।
BidiMap এবং Advanced Map Operations এর সুবিধা:
| Operation | Description | Usage |
|---|---|---|
| BidiMap | Two-way map that allows bidirectional key-value access. | For scenarios where you need reverse lookup. |
| Map Filtering | Filter map based on a predicate (condition). | For extracting specific elements based on conditions. |
| Map Transformation | Apply transformation to map values or keys. | For transforming map values or keys to new formats. |
| Map Aggregation | Perform aggregation operations like sum, average, etc. | For performing statistical operations on map values. |
সারাংশ
Apache Commons Collections এর BidiMap এবং Advanced Map Operations শক্তিশালী এবং কার্যকরী ডাটা স্ট্রাকচার সরবরাহ করে যা Java Collections Framework এর সাধারণ ম্যাপের তুলনায় আরও উন্নত কার্যক্ষমতা প্রদান করে। BidiMap আপনাকে একই কী বা মান থেকে উভয় দিকের অ্যাক্সেস প্রদান করে, যখন Advanced Map Operations ম্যাপের উপর ফিল্টারিং, ট্রান্সফরমেশন, এবং অ্যাগ্রিগেশন এর মতো উন্নত অপারেশন করতে সহায়তা করে। এগুলির মাধ্যমে আপনি ডাটা ম্যানিপুলেশন ও ব্যবস্থাপনাকে আরো কার্যকরী এবং নমনীয়ভাবে করতে পারেন।
BidiMap (Bidirectional Map) হল একটি বিশেষ ধরনের Map যা দুইটি দিক থেকে কাজ করতে সক্ষম। অর্থাৎ, এটি একটি key-value সম্পর্কের পাশাপাশি value-key সম্পর্কও ধারণ করে। সাধারণত, Map-এ কেবল key -> value সম্পর্ক থাকে, কিন্তু BidiMap-এ আপনি value -> key সম্পর্কও অ্যাক্সেস করতে পারেন। এটি Apache Commons Collections লাইব্রেরির একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা Map-এর ডেটা স্ট্রাকচারের কার্যকারিতা বাড়ায়।
BidiMap এর বৈশিষ্ট্য
- Bidirectional Lookup:
- BidiMap আপনাকে একটি key থেকে value এবং value থেকে key উভয় দিকেই অনুসন্ধান করার সুযোগ দেয়।
- এটি সাধারণ Map এর তুলনায় আরও বেশি কার্যকরী, কারণ আপনি একে অপরের বিপরীতে ডেটার অ্যাক্সেস করতে পারেন।
- Dual Relationship:
- একটি BidiMap-এ কেবল একটি key-value সম্পর্ক থাকে না, বরং একই মান (value) এবং কী (key)-এর মধ্যে উল্টো সম্পর্কও তৈরি হয়।
- Unique Values:
- BidiMap সাধারণত unique values ধারণ করে, অর্থাৎ একটি মানের জন্য একমাত্র একটি কী থাকতে পারে। যদিও এটি সাধারণ Map এর মতো অনেক কীগুলোর জন্য একাধিক মান ধারণ করতে পারে, তবে উল্টো দিকেও একাধিক মান থাকতে পারে না।
- Bidirectional Access:
- এটি আপনাকে একটি উপাদান অ্যাক্সেস করার জন্য উভয় দিকের এক্সেস সরবরাহ করে। একদিকে আপনি key ব্যবহার করে value বের করতে পারেন এবং অন্যদিকে আপনি value ব্যবহার করে key বের করতে পারেন।
BidiMap এর বিভিন্ন বাস্তবায়ন
Apache Commons Collections লাইব্রেরিতে দুটি প্রধান BidiMap বাস্তবায়ন রয়েছে:
DualHashBidiMap: এটি একটি বাস্তবায়ন যা HashMap এবং HashSet এর মতো উপাদান ব্যবহার করে।TreeBidiMap: এটি একটি বাস্তবায়ন যা TreeMap এর ভিত্তিতে কাজ করে এবং BidiMap এর সমস্ত বৈশিষ্ট্য প্রদান করে, তবে এতে sorted order থাকে।
BidiMap এর উদাহরণ
এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে BidiMap এর কাজ দেখানো হয়েছে:
Example: BidiMap in Apache Commons Collections
import org.apache.commons.collections4.map.BidiMap;
import org.apache.commons.collections4.map.DualHashBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
// Create a BidiMap instance
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Add key-value pairs
bidiMap.put("apple", "fruit");
bidiMap.put("carrot", "vegetable");
bidiMap.put("banana", "fruit");
// Access value using key
System.out.println("apple is a " + bidiMap.get("apple")); // Output: apple is a fruit
// Access key using value
System.out.println("The key for value 'fruit' is " + bidiMap.getKey("fruit")); // Output: The key for value 'fruit' is apple
// Check if a specific value exists
System.out.println("Does 'carrot' exist as a key? " + bidiMap.containsKey("carrot")); // Output: true
System.out.println("Does 'vegetable' exist as a value? " + bidiMap.containsValue("vegetable")); // Output: true
}
}
Output:
apple is a fruit
The key for value 'fruit' is apple
Does 'carrot' exist as a key? true
Does 'vegetable' exist as a value? true
ব্যাখ্যা:
- এখানে,
DualHashBidiMapব্যবহার করে একটি BidiMap তৈরি করা হয়েছে। put()মেথডের মাধ্যমে key-value পেয়ার যোগ করা হয়েছে।get()মেথডটি key থেকে value রিটার্ন করছে।getKey()মেথডটি value থেকে key রিটার্ন করছে।containsKey()এবংcontainsValue()মেথডগুলি অনুসন্ধানের জন্য ব্যবহৃত হয়েছে, যা নির্ধারণ করে যে কোনও কী বা মান ম্যাপে আছে কিনা।
BidiMap এর ব্যবহার এবং সুবিধা
- Bidirectional Lookup:
- সাধারণ Map যেখানে আপনি কেবল key থেকে value পেতে পারেন, BidiMap আপনাকে উল্টোভাবে value থেকে key পেতে সক্ষম করে, যা বিশেষভাবে দরকারী হতে পারে যখন আপনি উল্টো দিকে অনুসন্ধান করতে চান।
- Efficient Key-Value Relationship:
- BidiMap ডেটা স্ট্রাকচারটি key-value সম্পর্কের পাশাপাশি value-key সম্পর্ক বজায় রাখতে সাহায্য করে। এটি ডেটার প্রক্রিয়াকরণ এবং মান অনুযায়ী অনুসন্ধানকে আরো দ্রুত করে তোলে।
- Use Cases:
- Mapping Identifiers: যখন একটি unique identifier (key) এবং সেই identifier এর সাথে সংশ্লিষ্ট value দুটি আলাদা আলাদা ভাবে প্রয়োজন হয়।
- Reverse Lookup: কোনো বিশেষ value এর জন্য সেই value এর associated key রিটার্ন করতে হবে, তখন BidiMap একটি চমৎকার সমাধান হতে পারে।
- Efficiency:
- BidiMap যে ধরনের hashing বা sorting ব্যবহার করে তা আপনাকে উভয় দিক থেকে দ্রুত এক্সেস প্রদান করে, যা অন্যান্য Map এর তুলনায় কার্যকরী হতে পারে।
BidiMap এর সীমাবদ্ধতা
- Memory Usage:
- BidiMap দুটো দিক থেকে মান ধারণ করে, তাই এটি Map এর তুলনায় বেশি মেমরি ব্যবহার করতে পারে, কারণ একই ডেটা একাধিকভাবে সংরক্ষিত থাকে।
- Unidirectional Key-Value Assumption**:
- কিছু ক্ষেত্রে আপনি শুধুমাত্র একটি দিকের সম্পর্ক প্রয়োজন হতে পারেন, যেখানে BidiMap এর ব্যবহার অতিরিক্ত হয়ে পড়তে পারে।
- Unique Values:
- BidiMap এর মধ্যে একটি মান (value) শুধুমাত্র একাধিক কী (key) এর সাথে সম্পর্কিত হতে পারে না। এটি এমনকি unique values থাকতে বাধ্য করে।
BidiMap হল Map ডেটা স্ট্রাকচারের একটি শক্তিশালী উন্নত সংস্করণ যা আপনাকে key-value সম্পর্কের পাশাপাশি value-key সম্পর্কও এক্সেস করার সুযোগ দেয়। এটি দুই দিক থেকে ডেটা অনুসন্ধান করার জন্য কার্যকরী এবং বিভিন্ন key-value রিলেশনশিপ ম্যানেজ করার জন্য উপযুক্ত। DualHashBidiMap এবং TreeBidiMap এর মতো বাস্তবায়নগুলি BidiMap এর সুবিধা প্রদান করে, যেখানে আপনি দ্রুত এবং কার্যকরীভাবে bidirectional lookup করতে পারেন।
Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা উন্নত ডেটা স্ট্রাকচার প্রদান করে, এবং এর মধ্যে DualHashBidiMap এবং DualTreeBidiMap দুটি বিশেষ ধরনের BidiMap (Bidirectional Map) ক্লাস। এই দুটি ক্লাস আপনাকে একটি মানচিত্রে কি-to-value এবং value-to-key উভয় দিক থেকে অ্যাক্সেস করতে সক্ষম করে। এরা মূলত two-way mapping প্রদান করে, যেখানে আপনি একটি মান থেকে কী এবং একটি কী থেকে মান খুঁজে পেতে পারেন।
এখানে, আমরা DualHashBidiMap এবং DualTreeBidiMap এর ব্যবহার এবং পার্থক্য নিয়ে আলোচনা করব।
1. DualHashBidiMap
DualHashBidiMap হল একটি BidiMap যা HashMap এর মতো কার্যকরীভাবে কাজ করে এবং কী ও মানের মধ্যে দ্বৈত সংযোগ (bidirectional mapping) তৈরি করে। এটি উভয় দিক থেকে মানের অ্যাক্সেস এবং সঞ্চালন করতে পারে। DualHashBidiMap একটি অর্ডারবিহীন মানচিত্র প্রদান করে, যার মাধ্যমে আপনি কী থেকে মান এবং মান থেকে কী উভয় দিক থেকে অ্যাক্সেস করতে পারবেন।
DualHashBidiMap এর বৈশিষ্ট্য:
- Bidirectional: এটি একটি কী থেকে মান এবং মান থেকে কী উভয় দিক থেকে অ্যাক্সেস প্রদান করে।
- HashMap ভিত্তিক: এটি HashMap ব্যবহার করে এবং এতে কোনও নির্দিষ্ট ক্রম থাকে না (অর্ডারবিহীন)।
- Unordered: এটি অর্ডার বজায় রাখে না এবং সাধারণত দ্রুত অ্যাক্সেস প্রদান করে।
DualHashBidiMap উদাহরণ:
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
public class DualHashBidiMapExample {
public static void main(String[] args) {
// Create a DualHashBidiMap
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Add key-value pairs
bidiMap.put("A", "Apple");
bidiMap.put("B", "Banana");
// Access value by key
System.out.println("A -> " + bidiMap.get("A")); // Output: Apple
// Access key by value
System.out.println("Apple -> " + bidiMap.getKey("Apple")); // Output: A
}
}
এখানে:
- DualHashBidiMap ব্যবহার করে আমরা key-to-value এবং value-to-key এর মধ্যে সম্পর্ক স্থাপন করেছি।
- get() পদ্ধতি দিয়ে মান প্রাপ্তি এবং getKey() পদ্ধতি দিয়ে কী প্রাপ্তি করা হয়েছে।
2. DualTreeBidiMap
DualTreeBidiMap হল একটি BidiMap যা TreeMap ভিত্তিক এবং এটি কী এবং মান উভয়ের জন্য Sorted Order প্রদান করে। এটি কী ও মানের মধ্যে bidirectional mapping প্রদান করে এবং মানগুলিকে sorted (সাজানো) অবস্থায় রাখে।
DualTreeBidiMap এর বৈশিষ্ট্য:
- Bidirectional: এটি একটি কী থেকে মান এবং মান থেকে কী উভয় দিক থেকে অ্যাক্সেস প্রদান করে।
- TreeMap ভিত্তিক: এটি TreeMap ব্যবহার করে, যা কী এবং মান উভয়কেই সজ্জিত করে (sorted by key).
- Ordered: এটি কী এবং মানের জন্য সাজানো তথ্য প্রদান করে।
DualTreeBidiMap উদাহরণ:
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualTreeBidiMap;
public class DualTreeBidiMapExample {
public static void main(String[] args) {
// Create a DualTreeBidiMap
BidiMap<String, String> bidiMap = new DualTreeBidiMap<>();
// Add key-value pairs
bidiMap.put("A", "Apple");
bidiMap.put("B", "Banana");
bidiMap.put("C", "Cherry");
// Access value by key (sorted order)
System.out.println("A -> " + bidiMap.get("A")); // Output: Apple
System.out.println("B -> " + bidiMap.get("B")); // Output: Banana
// Access key by value
System.out.println("Apple -> " + bidiMap.getKey("Apple")); // Output: A
System.out.println("Banana -> " + bidiMap.getKey("Banana")); // Output: B
}
}
এখানে:
- DualTreeBidiMap ব্যবহার করে কী এবং মান উভয়ের জন্য sorted order প্রদান করা হয়েছে। TreeMap এর সুবিধা অনুসারে, এখানে কী গুলি অর্ডারড এবং ডুপ্লিকেট কী অনুমোদিত নয়।
DualHashBidiMap এবং DualTreeBidiMap এর মধ্যে পার্থক্য
| পয়েন্ট | DualHashBidiMap | DualTreeBidiMap |
|---|---|---|
| ভিত্তি | HashMap ভিত্তিক | TreeMap ভিত্তিক |
| অর্ডার | অর্ডারবিহীন (unordered) | সাজানো (sorted by key) |
| পারফরম্যান্স | দ্রুত অ্যাক্সেস প্রদান করে (এছাড়া অর্ডার থাকে না) | ধীর হতে পারে কারণ এটি কী অনুযায়ী সাজানো থাকে |
| উপকারিতা | দ্রুত কীরকম অ্যাক্সেস এবং বড় ডেটা সেটে কার্যকরী | ডেটাকে কী দ্বারা সাজানো (sorted) থাকা প্রয়োজন |
| কী-মূল্য সম্পর্ক | উভয় দিকের অ্যাক্সেস (bidirectional) | উভয় দিকের অ্যাক্সেস (bidirectional) |
কখন DualHashBidiMap ব্যবহার করবেন?
- যখন আপনাকে দ্রুত মানচিত্রের মাধ্যমে উপাদান অ্যাক্সেস করতে হবে এবং আপনি কী বা মানের সাজানো অবস্থান প্রয়োজন মনে করছেন না।
- যখন ডেটার সংখ্যা খুব বেশি এবং অর্ডারের প্রয়োজন নেই।
কখন DualTreeBidiMap ব্যবহার করবেন?
- যখন আপনাকে কী এবং মান উভয় দিক থেকে সাজানো (sorted) অবস্থায় অ্যাক্সেস করতে হবে।
- যখন ডেটা সেট ছোট না হয় এবং কী অনুযায়ী সাজানো থাকা প্রয়োজন।
সারাংশ
DualHashBidiMap এবং DualTreeBidiMap উভয়ই BidiMap এর বাস্তবায়ন, তবে তাদের মধ্যে পার্থক্য হলো DualHashBidiMap দ্রুত অ্যাক্সেস এবং অর্ডারবিহীন মানচিত্র সরবরাহ করে, যেখানে DualTreeBidiMap কী এবং মান উভয়কেই সাজানো অবস্থায় (sorted) রাখে। DualHashBidiMap সাধারণত দ্রুততর পারফরম্যান্স প্রদান করে, কিন্তু DualTreeBidiMap সাজানো ডেটা প্রক্রিয়ার জন্য উপযোগী। উভয়ই কী থেকে মান এবং মান থেকে কী এর মধ্যে সম্পর্ক বজায় রাখে এবং ডেটা প্রক্রিয়াতে শক্তিশালী সমাধান প্রদান করে।
Apache Commons Collections লাইব্রেরি Java Collections Framework এর জন্য অতিরিক্ত ডেটা স্ট্রাকচার প্রদান করে। এর মধ্যে দুটি গুরুত্বপূর্ণ Map ইন্টারফেস হল OrderedMap এবং SortedMap, যা কিভাবে ম্যাপের উপাদানগুলির অর্ডার বা শ্রেণীবদ্ধতা (sorting) বজায় রাখতে হবে তা নির্ধারণ করে।
এখানে আলোচনা করা হবে কিভাবে OrderedMap এবং SortedMap ব্যবস্থাপনা করতে হয় এবং Apache Commons Collections এ এই দুটি ইন্টারফেসের কার্যকারিতা কীভাবে ব্যবহৃত হয়।
1. OrderedMap (অর্ডার্ড ম্যাপ)
OrderedMap হল একটি ইন্টারফেস যা Map এর উপাদানগুলির ইনসার্ট অর্ডার বজায় রাখে। এর মানে হল যে, যখন আপনি OrderedMap এ একটি নতুন কী-মান পেয়ার যোগ করবেন, তখন এটি উপাদানগুলির ইনসার্ট অর্ডার অনুযায়ী তাদের সংরক্ষণ করবে।
OrderedMap এর প্রধান বৈশিষ্ট্য:
- এটি Map এর মতোই কাজ করে, তবে ইনসার্ট অর্ডার বজায় রাখে।
- আপনি keySet() বা entrySet() এর মাধ্যমে ইনসার্ট অর্ডারে উপাদানগুলি অ্যাক্সেস করতে পারবেন।
OrderedMap উদাহরণ
Apache Commons Collections এ OrderedMap বাস্তবায়ন হিসেবে LinkedMap ব্যবহার করা হয়।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.map.LinkedMap;
import java.util.Map;
public class OrderedMapExample {
public static void main(String[] args) {
// OrderedMap তৈরি করা (LinkedMap)
Map<String, String> orderedMap = new LinkedMap<>();
// উপাদান যোগ করা
orderedMap.put("first", "apple");
orderedMap.put("second", "banana");
orderedMap.put("third", "cherry");
// ইনসার্ট অর্ডারে উপাদান দেখতে
System.out.println("OrderedMap: " + orderedMap);
// keySet() এর মাধ্যমে উপাদান দেখতে
System.out.println("Keys in insertion order: " + orderedMap.keySet());
}
}
আউটপুট:
OrderedMap: {first=apple, second=banana, third=cherry}
Keys in insertion order: [first, second, third]
এখানে:
- LinkedMap ক্লাসটি OrderedMap ইন্টারফেসের একটি বাস্তবায়ন।
- উপাদানগুলি ইনসার্ট অর্ডারে সংরক্ষিত থাকে, এবং keySet() মাধ্যমে ইনসার্ট অর্ডার অনুযায়ী কীগুলি পাওয়া যায়।
2. SortedMap (সার্টেড ম্যাপ)
SortedMap হল একটি ইন্টারফেস যা Map এর উপাদানগুলিকে স্বয়ংক্রিয়ভাবে sort করে রাখে, অথবা এটি উপাদানগুলিকে একটি নির্দিষ্ট ক্রম অনুযায়ী সাজিয়ে রাখে। এটি মূলত Map ইন্টারফেসের একটি বিকল্প যেখানে কীগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে ascending order বা custom comparator এর মাধ্যমে সাজানো হয়।
SortedMap এর প্রধান বৈশিষ্ট্য:
- এটি কীগুলির মধ্যে স্বয়ংক্রিয়ভাবে সাজানোর ব্যবস্থা করে।
- TreeMap হল SortedMap এর একটি জনপ্রিয় বাস্তবায়ন যা কীগুলিকে natural order বা একটি Comparator এর মাধ্যমে সাজায়।
SortedMap উদাহরণ
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
public class SortedMapExample {
public static void main(String[] args) {
// SortedMap তৈরি করা (TreeMap)
SortedMap<String, String> sortedMap = new TreeMap<>();
// উপাদান যোগ করা
sortedMap.put("first", "apple");
sortedMap.put("third", "banana");
sortedMap.put("second", "cherry");
// কীগুলিকে সাজানো অবস্থায় দেখতে
System.out.println("SortedMap: " + sortedMap);
}
}
আউটপুট:
SortedMap: {first=apple, second=cherry, third=banana}
এখানে:
- TreeMap একটি SortedMap এর বাস্তবায়ন, যা কীগুলিকে স্বয়ংক্রিয়ভাবে ascending order এ সাজিয়ে রাখে।
- কীগুলি lexicographical order অনুসারে সাজানো হয়েছে।
SortedMap এর বৈশিষ্ট্য:
firstKey(): প্রথম কীগুলি রিটার্ন করে।lastKey(): সর্বশেষ কীগুলি রিটার্ন করে।headMap(K toKey): নির্দিষ্ট কীয়ের আগে থাকা উপাদানগুলির সাব-মানচিত্র প্রদান করে।tailMap(K fromKey): নির্দিষ্ট কীয়ের পর থাকা উপাদানগুলির সাব-মানচিত্র প্রদান করে।
3. OrderedMap এবং SortedMap এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | OrderedMap | SortedMap |
|---|---|---|
| অর্ডার | ইনসার্ট অর্ডার বজায় রাখে | কীগুলি সাজানো থাকে, সাধারণত ascending order অথবা কাস্টম comparator দিয়ে |
| প্রধান বাস্তবায়ন | LinkedMap | TreeMap |
| টাস্ক | কীগুলির ইনসার্ট অর্ডার ধরে রাখা | কীগুলিকে সাজানো রাখা |
| মেথড | keySet(), entrySet() | firstKey(), lastKey(), headMap(), tailMap() |
সারাংশ
- OrderedMap: এটি একটি Map যা ইনসার্ট অর্ডার বজায় রাখে, এবং সাধারণত LinkedMap এর মাধ্যমে বাস্তবায়িত হয়।
- SortedMap: এটি একটি Map যেখানে কীগুলি স্বয়ংক্রিয়ভাবে ascending order বা কাস্টম Comparator এর মাধ্যমে সাজানো হয়, এবং সাধারণত TreeMap এর মাধ্যমে বাস্তবায়িত হয়।
- OrderedMap এবং SortedMap উভয়ই Apache Commons Collections এ গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, যা বিভিন্ন Map পরিচালনার জন্য ব্যবহার করা হয়। OrderedMap ইনসার্ট অর্ডার বজায় রাখে, এবং SortedMap কীগুলির উপর সাজানোর সুবিধা প্রদান করে।
অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরিতে MapUtils ক্লাস বিভিন্ন ধরণের ম্যাপ (Map) পরিচালনা সহজ করে। এটি সাধারণ Map অপারেশন যেমন ইটারেশন, ডিফল্ট মান সেট করা, বা রিভার্স ম্যাপ তৈরির জন্য উন্নত ফিচার সরবরাহ করে।
Map Iteration
Map এর উপর ইটারেশন করা জাভার সাধারণ পদ্ধতি হলেও অ্যাপাচি কমন্সের MapUtils এটি আরও সহজ এবং কার্যকর করে তোলে।
১. স্ট্যান্ডার্ড পদ্ধতিতে Map ইটারেশন
import java.util.HashMap;
import java.util.Map;
public class StandardMapIteration {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
map.put("Orange", 2);
// Key-Value ইটারেট করা
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
২. MapUtils ব্যবহার করে সহজ ইটারেশন
MapUtils.verbosePrint() বা MapUtils.debugPrint() এর মাধ্যমে একটি ম্যাপের কনটেন্ট দ্রুত প্রিন্ট করা যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtilsIteration {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
map.put("Orange", 2);
// Map এর কনটেন্ট প্রিন্ট করা
MapUtils.verbosePrint(System.out, "Fruit Counts", map);
}
}
আউটপুট:
Fruit Counts = {3 entries}
Apple = 3
Banana = 5
Orange = 2
MapUtils এর উন্নত ব্যবহার
১. Default Value প্রদান
কখনো কখনো null ভ্যালু এড়ানোর জন্য ম্যাপ থেকে ডিফল্ট মান রিটার্ন করার প্রয়োজন হতে পারে।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class DefaultValueExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
// ডিফল্ট মান প্রদান
int orangeCount = MapUtils.getIntValue(map, "Orange", 0);
System.out.println("Orange Count: " + orangeCount); // আউটপুট: 0
}
}
২. Reversed Map তৈরি
MapUtils.invertMap() ব্যবহার করে একটি ম্যাপের কী এবং ভ্যালু উল্টানো যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class InvertMapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("One", "1");
map.put("Two", "2");
map.put("Three", "3");
// কী এবং ভ্যালু উল্টানো
Map<String, String> reversedMap = MapUtils.invertMap(map);
System.out.println("Reversed Map: " + reversedMap);
}
}
আউটপুট:
Reversed Map: {1=One, 2=Two, 3=Three}
৩. Unmodifiable Map তৈরি
MapUtils.unmodifiableMap() ব্যবহার করে একটি Immutable Map তৈরি করা যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class UnmodifiableMapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("Key1", "Value1");
map.put("Key2", "Value2");
// Unmodifiable Map তৈরি
Map<String, String> unmodifiableMap = MapUtils.unmodifiableMap(map);
// নতুন মান যোগ করার চেষ্টা
unmodifiableMap.put("Key3", "Value3"); // UnsupportedOperationException থ্রো করবে
}
}
৪. Lazy Map তৈরি
MapUtils.lazyMap() ব্যবহার করে এমন একটি ম্যাপ তৈরি করা যায়, যেখানে নতুন কী ব্যবহার করলে একটি ডিফল্ট মান বা অবজেক্ট স্বয়ংক্রিয়ভাবে তৈরি হয়।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Factory;
import java.util.HashMap;
import java.util.Map;
public class LazyMapExample {
public static void main(String[] args) {
Map<String, String> lazyMap = MapUtils.lazyMap(new HashMap<>(), () -> "Default Value");
// নতুন কী-এর জন্য ডিফল্ট মান
System.out.println("Value for Key1: " + lazyMap.get("Key1"));
}
}
আউটপুট:
Value for Key1: Default Value
MapUtils এর সুবিধা
- কোড সংক্ষিপ্ত করে: কমন অপারেশন যেমন ডিফল্ট ভ্যালু, রিভার্স ম্যাপ, এবং ইটারেশন সহজ করে।
- নালপয়েন্টার এড়ায়:
nullচেক এবং ডিফল্ট মান সেট করার ফিচার আছে। - Immutable এবং Lazy Map: নিরাপদ এবং কার্যকর ডেটা ম্যানিপুলেশনের জন্য বিশেষভাবে কার্যকর।
- Debugging Friendly:
verbosePrintএবংdebugPrintদ্রুত ডিবাগিং সহায়তা করে।
সারাংশ
MapUtils হল অ্যাপাচি কমন্স কালেকশনসের একটি শক্তিশালী ইউটিলিটি ক্লাস, যা ম্যাপ পরিচালনার কাজকে সহজ এবং কার্যকর করে তোলে। এটি বিশেষত ডিফল্ট মান প্রদান, Immutable ম্যাপ তৈরি, এবং ম্যাপের ইটারেশন বা প্রিন্টিংয়ের ক্ষেত্রে অত্যন্ত কার্যকর।
Read more